package com.yky.dao.base;

import java.io.Serializable;
import java.util.LinkedHashMap;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Query;

import com.yky.entity.base.QueryResult;

/**
 * DAO层封装接口，包含常用的CURD和分页操作
 * 
 */
public interface IBaseDao<T> {

	/**
	 * 多条件-排序-起始页-结束页
	 * 
	 * @param firstindex
	 * @param maxresult
	 * @param wherejpql
	 * @param queryParams
	 * @param orderby
	 * @return
	 */
	public List findByPropertys(int firstindex, int maxresult,
			String wherejpql, Object[] queryParams,
			LinkedHashMap<String, String> orderby);

	/**
	 * 多条件带排序查询
	 */
	public List findByPropertys(String wherejpql, Object[] queryParams,
			LinkedHashMap<String, String> orderby);

	/**
	 * 多条件查询
	 * 
	 * @param wherejpql
	 * @param queryParams
	 * @return
	 */
	public List findByPropertys(String wherejpql, Object[] queryParams);

	/**
	 * 原生sql查询
	 * 
	 * @param sql
	 * @return
	 */

	public List findBySQL(final String sql);

	/**
	 * 根据属性查找对象
	 * 
	 * @param propertyName
	 *            属性（对应Bean）
	 * @param value
	 *            属性
	 * @return 根据属性查找对象
	 */
	public List<T> findByProperty(String propertyName, Object value);

	/**
	 * 查询某个类的list
	 * 
	 * @return
	 */
	public List<T> findEntityList();

	/**
	 * like语句查询
	 * 
	 * @param propertyName
	 * @param value
	 * @return
	 */
	public List<T> findEntityListByLike(String propertyName, Object value);

	/**
	 * 根据条件查询并排序
	 * 
	 * @param propertyName
	 * @param id
	 * @param string2
	 * @return
	 */
	public List<T> findByPropertyOrderBy(String propertyName, Object value,
			Object sortValue);

	/**
	 * 根据条件查询并排序. 取有限条数
	 * 
	 * @param propertyName
	 * @param value
	 * @param sortValue
	 * @param rownum
	 * @return
	 */
	public List findByPropertyOrderByAndRownum(String propertyName,
			Object value, Object sortValue, Integer rownum);

	/**
	 * 根据条件查询并排序. 取有限条数(倒序还是升序)
	 * 
	 * @param propertyName
	 * @param value
	 * @param sortValue
	 * @param sortDesc
	 * @param rownum
	 * @return
	 */
	public List findByPropertyOrderByStrAndRownum(String propertyName,
			Object value, Object sortValue, Object sortDesc, Integer rownum);

	/**
	 * 根据hql查询,直接使用HibernateTemplate的find函数. 取有限条数
	 * 
	 * @param hql
	 * @param rownum
	 * @return
	 */
	public List find(String hql, Integer rownum);

	/**
	 * 根据属性名和属性值查询唯一对象.
	 * 
	 * @param <T>
	 * @param propertyName
	 * @param value
	 * @return
	 */
	public <T> T findUniqueBy(String propertyName, Object value);

	/**
	 * 创建Query对象.
	 * 对于需要first,max,fetchsize,cache,cacheRegion等诸多设置的函数,可以在返回Query后自行设置.
	 * 留意可以连续设置,如下：
	 * 
	 * @param hql
	 * @param values
	 * @return 可变参数.
	 */
	public Query createQuery(String hql, Object... values);

	/**
	 * 获取记录总数
	 * 
	 * @param entityClass
	 *            实体类
	 * @return
	 */
	public int getCount();

	/**
	 * flush
	 */
	public void flush();

	/**
	 * clear
	 */
	public void clear();

	/**
	 * remove
	 * 
	 * @param o
	 */
	public void remove(Object o);

	/**
	 * 获取全部对象
	 * 
	 * @param <T>
	 * @return
	 */
	public <T> List<T> getAll();

	/**
	 * 获取全部对象,带排序字段与升降序参数.
	 */
	public <T> List<T> getAll(String orderBy, boolean isAsc);

	/**
	 * merge
	 * 
	 * @param <T>
	 * @return
	 */
	public <T> T merge();

	/**
	 * 保存实体
	 * 
	 * @param entity
	 *            实体id
	 */
	public void save(Object entity);

	/**
	 * 更新实体
	 * 
	 * @param entity
	 *            实体id
	 */
	public void update(Object entity);

	/**
	 * 删除实体
	 * 
	 * @param entityClass
	 *            实体类
	 * @param entityids
	 *            实体id数组
	 */
	public void delete(Serializable... entityids);

	/**
	 * saveOrUpdate
	 * 
	 * @param entity
	 */
	public void saveOrUpdate(Object entity);

	/**
	 * 获取实体
	 * 
	 * @param <T>
	 * @param entityClass
	 *            实体类
	 * @param entityId
	 *            实体id
	 * @return
	 */
	public T find(Serializable entityId);

	/**
	 * 获取分页数据
	 * 
	 * @param firstindex
	 *            开始索引
	 * @param maxresult
	 *            每页显示记录数
	 * @param wherejpql
	 *            where语句
	 * @param queryParams
	 *            查询参数
	 * @param orderby
	 *            排序序列
	 * @return 分页数据
	 */
	public QueryResult<T> getScrollData(final int firstindex,
			final int maxresult, final String wherejpql,
			final Object[] queryParams,
			final LinkedHashMap<String, String> orderby);

	/**
	 * 获取分页数据
	 * 
	 * @param firstindex
	 *            开始索引
	 * @param maxresult
	 *            每页显示记录数
	 * @param wherejpql
	 *            where语句
	 * @param queryParams
	 *            查询参数
	 * @return 分页数据
	 */
	public QueryResult<T> getScrollData(final int firstindex,
			final int maxresult, final String wherejpql,
			final Object[] queryParams);

	/**
	 * 获取分页数据
	 * 
	 * @param firstindex
	 *            开始索引
	 * @param maxresult
	 *            每页显示记录数
	 * @param orderby
	 *            排序序列
	 * @return 分页数据
	 */
	public QueryResult<T> getScrollData(final int firstindex,
			final int maxresult, final LinkedHashMap<String, String> orderby);

	/**
	 * 获取分页数据
	 * 
	 * @param firstindex
	 *            开始索引
	 * @param maxresult
	 *            每页显示记录数
	 * @return 分页数据
	 */
	public QueryResult<T> getScrollData(final int firstindex,
			final int maxresult);

	/**
	 * 获取所有对象
	 * 
	 * @return 所有对象
	 */
	public QueryResult<T> getScrollData();

	/**
	 * 创建Criteria对象 List集合中的数组元素包含三个子元素（依次为字段名、检索值和匹配条件）
	 * 匹配条件:min;max;like;exactitude;order如有其它需求可再添加
	 * 
	 * @param <T>
	 * @param reasons
	 * @return
	 */
	public <T> Criteria createCriteria(List reasons);
}
